package com.kexilo.core.common.annotation;

import java.lang.annotation.*;

/**
 * 重试注解
 * 用于标记需要重试的方法
 *
 * @author Kexilo
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Retry {

    /**
     * 重试次数，默认3次
     */
    int maxAttempts() default 3;

    /**
     * 重试间隔（毫秒），默认1秒
     */
    long delay() default 1000;

    /**
     * 重试间隔递增因子，默认1.5
     */
    double multiplier() default 1.5;

    /**
     * 最大重试间隔（毫秒），默认30秒
     */
    long maxDelay() default 30000;

    /**
     * 需要重试的异常类型，默认所有异常
     */
    Class<? extends Throwable>[] retryFor() default {Exception.class};

    /**
     * 不需要重试的异常类型
     */
    Class<? extends Throwable>[] noRetryFor() default {};

    /**
     * 重试策略
     */
    RetryPolicy policy() default RetryPolicy.EXPONENTIAL_BACKOFF;

    /**
     * 是否启用随机化延迟
     */
    boolean randomize() default false;

    /**
     * 重试策略枚举
     */
    enum RetryPolicy {
        /** 固定间隔 */
        FIXED_DELAY,
        /** 指数退避 */
        EXPONENTIAL_BACKOFF,
        /** 线性递增 */
        LINEAR_BACKOFF
    }
}
